xposed中函数参数byte[]类型数据读取

之前hook native函数是使用ADBI框架的,但是其平台有限,Android5效果稳定,Android6成功率不高,到Android7就无法使用了。
由于xposed(已支持Android8)也可以Hook native函数,可获取native函数的参数数据,因此想将hook的函数从ADBI框架移植到xposed模块中。但是遇到了一个问题:之前使用ADBI框架获取byte[]类型的参数数据是正常的,但是在xposed中只能获取到地址,一直提示参数为object类型。那么如何在xposed中获得真实数据呢?解决方案参考如下。

如下为ADBI框架中重写的函数,获取byte类型参数a的数据,并写入/sdcard/data.txt中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void new_hookData(JNIEnv* env, jobject thiz, jbyte *a) {

jbyte *arrayBody = (*env)->GetByteArrayElements(env,a,NULL);
jsize len = (*env)->GetArrayLength(env,a);
byte *dDate = (byte *)arrayBody;
int fd = open("/sdcard/data.txt", O_APPEND|O_RDWR|O_CREAT,S_IRWXU);

if(fd < 0)
{
LOGI("[+] open failed");
LOGW("[+] error (errno=%d)", errno);
}
else
{
LOGI("[+] success open");
}

int write_len = write(fd, dDate, len);

(*env)->ReleaseByteArrayElements(env,a,arrayBody,NULL);
close(fd);

old_hookData(env, thiz, a);
}

如下是xposed中的hook代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
findAndHookMethod("className",lp.classLoader,"methodName",byte[].class, new hookData());

class hookData extends XC_MethodHook{
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

byte[] buf = (byte[])param.args[0];
FileHelper filehelper = new FileHelper();
try {
//将byte数组写入文件
createFile("/sdcard/data.txt", buf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//将byte数组写入文件
public void createFile(String path, byte[] content) throws IOException {
FileOutputStream fos = new FileOutputStream(path);
fos.write(content);
fos.close();
}
}

over!